package com.syedu.day18;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;

/**
 * @author Administrator
 * @Description 使用反射获取类的属性并且操作属性
 * <p>
 * java.lang.reflect.Modifier       表示修饰符的类
 * java.lang.reflect.Field          表示属性的类
 * java.lang.reflect.Constructor    表示构造的类
 * java.lang.reflect.Method         表示方法的类
 * java.lang.reflect.Array          表示数组的类
 * @createTime 2022/4/11 9:08
 */
public class FieldReflect {
    public static void main(String[] args) {
        Class<Point> c = Point.class;

        //获取类的公共属性
        //Field[] fields = c.getFields();

        //获取类的所有属性(包括私有化属性)
        Field[] fields = c.getDeclaredFields();

        //遍历数组
        for (Field f : fields) {
            //System.out.println(f);
            //获取属性的修饰符
            String modifierStr = Modifier.toString(f.getModifiers());
            //获取属性的数据类型
            String typeName = f.getType().getName();
            //获取属性的名称
            String name = f.getName();
            //打印结果
            System.out.println(modifierStr + " " + typeName + " " + name);
        }

        System.out.println("---------------------------------------------");

        try {
            //准备Point类的对象
            Point p = c.getConstructor().newInstance();  //Point p = new Point()
            //获取单个指定的属性,并且操作
            //获取类中名为x的属性对象
            Field fieldX = c.getDeclaredField("x");
            //注意:操作私有化成员时,需要开启权限,否则会抛出异常:java.lang.IllegalAccessException
            fieldX.setAccessible(true);
            //反射获取x属性的值,参数为point对象
            Object o = fieldX.get(p);
            System.out.println("修改前x的值:" + o);

            //修改x属性的值
            fieldX.set(p,10);

            o = fieldX.get(p);
            System.out.println("修改后x的值:" + o);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}
